home *** CD-ROM | disk | FTP | other *** search
/ Mac Mania 4 / MacMania 4.toast / / Demo's / Igor Demo Pro / 1 PutContentsIn Igor Pro Folder / WaveMetrics Procedures / Waves / Make Sample Data Controls < prev    next >
Text File  |  1996-01-29  |  13KB  |  424 lines

  1. // Make Sample Data Controls
  2. //    These procedures are designed to help you generate test data which is useful
  3. //    for testing analysis and number-crunching procedures.
  4. //    To use them:
  5. //        Hide this window.
  6. //        Choose ‘Show Sample Data Panel’ from the Macros menu.
  7. //        This will display a control panel.
  8. //     See the example experiment "Make Sample Data Demo" in the "Examples" folder for further details.
  9.  
  10. // HR, 12/95. Updated and revised for Igor Pro 3.0.
  11. //        Used rtGlobals and data folders to store globals.
  12. //        Simplified menu so that it just creates a single control panel.
  13.  
  14. #pragma rtGlobals=1
  15. #include <Make Sample Data>, menus=0
  16.  
  17. Menu "Macros"
  18.     "Show Sample Data Panel", ShowSampleDataPanel()
  19.     help = {"Displays a control panel that makes it easy to generate test data."}
  20. End
  21.  
  22. // InitSampleDataControlsGlobals()
  23. //    Creates global settings used by other routines.
  24. //    In most cases you will not need to tweak these globals.
  25. Function InitSampleDataControlsGlobals()
  26.     String dfSav =  SetMakeSampleDataFolderCurrent()
  27.     Variable/G gSetVarNumPoints = 500
  28.     Variable/G gSetVarXMin = 0
  29.     Variable/G gSetVarXMax = 6
  30.     Variable/G gSetVarAmplitude = 1
  31.     Variable/G gSetVarOffset = 0
  32.     Variable/G gSetVarXNoise = 0
  33.     Variable/G gSetVarYNoise = 0
  34.     Variable/G gSetVarPhase = 0
  35.     Variable/G gSetVarCycles = 1
  36.     Variable/G gSetVarWidthInDegrees = 45
  37.     Variable/G gSetVarTimeConstant = 1
  38.     Variable/G gSetVarXCenter = 3
  39.     Variable/G gSetVarFWHM = 1
  40.     Variable/G gSetVarFunctionType=1
  41.     Variable/G gSetVarGlobalsInited=1
  42.     SetDataFolder dfSav
  43. End
  44.  
  45. Function AddPeriodicControls()
  46.     String dfSav =  SetMakeSampleDataFolderCurrent()
  47.     PopupMenu MSD_Type,pos={190,4},mode=1,value= #"\"Sine;Square;Triangle;Sawtooth\""
  48.     SetVariable MSD_Phase,pos={25,76},size={119,14},title="Phase (°)",font="Geneva",fSize=10
  49.     SetVariable MSD_Phase,limits={-360,360,1},value=gSetVarPhase
  50.     SetVariable MSD_Cycles,pos={155,76},size={103,14},title="Cycles",font="Geneva"
  51.     SetVariable MSD_Cycles,fSize=10,limits={0,INF,1},value=gSetVarCycles
  52.     SetDataFolder dfSav
  53. End
  54.  
  55. Function RemovePeriodicControls()
  56.     KillControl MSD_Type
  57.     KillControl MSD_Phase
  58.     KillControl MSD_Cycles
  59. End
  60.  
  61. Function UpdatePeriodicData(xWave, yWave, mode, type, offset, amplitude)
  62.     String xWave, yWave
  63.     Variable mode, type, offset, amplitude
  64.  
  65.     Variable/D phase, cycles
  66.     
  67.     ControlInfo MSD_Phase; phase = V_value
  68.     ControlInfo MSD_Cycles; cycles = V_value
  69.     MakeSamplePeriodic(xWave, yWave, mode, type, offset, amplitude, phase, cycles)
  70. End
  71.  
  72. Function AddPulseControls()
  73.     String dfSav =  SetMakeSampleDataFolderCurrent()
  74.     SetVariable MSD_Phase,pos={25,76},size={119,14},title="Phase (°)",font="Geneva",fSize=10
  75.     SetVariable MSD_Phase,limits={-360,360,1},value=gSetVarPhase
  76.     SetVariable MSD_Cycles,pos={155,76},size={103,14},title="Cycles",font="Geneva"
  77.     SetVariable MSD_Cycles,fSize=10,limits={0,INF,1},value=gSetVarCycles
  78.     SetVariable MSD_WidthInDegrees,pos={272,76},size={98,14},title="Width (°)",font="Geneva",fsize=10
  79.     SetVariable MSD_WidthInDegrees value=gSetVarWidthInDegrees,format=""
  80.     SetDataFolder dfSav
  81. End
  82.  
  83. Function RemovePulseControls()
  84.     KillControl MSD_Phase
  85.     KillControl MSD_Cycles
  86.     KillControl MSD_WidthInDegrees
  87. End
  88.  
  89. Function UpdatePulseData(xWave, yWave, mode, offset, amplitude)
  90.     String xWave, yWave
  91.     Variable mode, offset, amplitude
  92.  
  93.     Variable/D phase, cycles, widthInDegrees
  94.     
  95.     ControlInfo MSD_Phase; phase = V_value
  96.     ControlInfo MSD_Cycles; cycles = V_value
  97.     ControlInfo MSD_WidthInDegrees; widthInDegrees = V_value
  98.     MakeSamplePulse(xWave, yWave, mode, offset, amplitude, phase, cycles, widthInDegrees)
  99. End
  100.  
  101. Function AddExponentialControls()
  102.     String dfSav =  SetMakeSampleDataFolderCurrent()
  103.     SetVariable MSD_TimeConstant pos={5,76},size={139,14},title="Time Constant",font="Geneva"
  104.     SetVariable MSD_TimeConstant fsize=10,value=gSetVarTimeConstant,format=""
  105.     SetDataFolder dfSav
  106. End
  107.  
  108. Function RemoveExponentialControls()
  109.     KillControl MSD_TimeConstant
  110. End
  111.  
  112. Function UpdateExponentialData(xWave, yWave, mode, offset, amplitude)
  113.     String xWave, yWave
  114.     Variable mode, offset, amplitude
  115.  
  116.     Variable/D tc
  117.     
  118.     ControlInfo MSD_TimeConstant; tc = V_value
  119.     MakeSampleExponential(xWave, yWave, mode, offset, amplitude, tc)
  120. End
  121.  
  122. Function AddGaussianControls()
  123.     String dfSav =  SetMakeSampleDataFolderCurrent()
  124.     SetVariable MSD_XCenter pos={32,76},size={112,14},title="X Center",font="Geneva"
  125.     SetVariable MSD_XCenter fsize=10,value=gSetVarXCenter,format=""
  126.     SetVariable MSD_FWHM,pos={154,76},size={104,14},title="FWHM",font="Geneva",fSize=10
  127.     SetVariable MSD_FWHM,limits={-INF,INF,1},value=gSetVarFWHM
  128.     SetDataFolder dfSav
  129. End
  130.  
  131. Function RemoveGaussianControls()
  132.     KillControl MSD_XCenter
  133.     KillControl MSD_FWHM
  134. End
  135.  
  136. Function UpdateGaussianData(xWave, yWave, mode, offset, amplitude)
  137.     String xWave, yWave
  138.     Variable mode, offset, amplitude
  139.  
  140.     Variable/D xCenter, fwhm
  141.     
  142.     ControlInfo MSD_XCenter; xCenter = V_value
  143.     ControlInfo MSD_FWHM; fwhm = V_value
  144.     MakeSampleGaussian(xWave, yWave, mode, offset, amplitude, xCenter, fwhm)
  145. End
  146.  
  147. Function AddNoiseControls()
  148.     PopupMenu MSD_Type,pos={167,4},mode=1,value= #"\"Normal;Even\""
  149. End
  150.  
  151. Function RemoveNoiseControls()
  152.     KillControl MSD_Type
  153. End
  154.  
  155. Function UpdateNoiseData(xWave, yWave, mode, offset, amplitude)
  156.     String xWave, yWave
  157.     Variable/D mode, offset, amplitude
  158.  
  159.     Variable/D type, whichWave
  160.     
  161.     ControlInfo MSD_Type; type = V_value
  162. //    ControlInfo MSD_WhichWave; whichWave = V_value        // this control is not yet implemented
  163.     whichWave = 2        // means add noise to y data
  164.     MakeSampleNoise(xWave, yWave, mode, offset, amplitude, type, whichWave)
  165. End
  166.  
  167. Function MSD_UpdateProc(ctrlName) : ButtonControl
  168.     String ctrlName
  169.     
  170.     PauseUpdate; Silent 1
  171.     
  172.     NVAR gAutoDisplay = root:Packages:'Make Sample Data':gAutoDisplay
  173.  
  174.     Variable mode, type, numPoints
  175.     String functionType
  176.     Variable/D xMin, xMax, percentXNoise, percentYNoise
  177.     Variable/D amplitude, offset
  178.     String xWave, yWave
  179.     Variable xIsNew = 0
  180.     Variable yIsNew = 0
  181.     
  182.     Variable isPanelWindow                 // HR, 12/11/95. Need to know type of window containing controls below.
  183.     isPanelWindow = WinType("")==7
  184.     
  185.     ControlInfo MSD_XOutWave; xWave = S_value
  186.     ControlInfo MSD_YOutWave; yWave = S_value
  187.     
  188.     ControlInfo MSD_Mode; mode = V_value
  189.     ControlInfo MSD_FunctionType; functionType = S_value
  190.     ControlInfo MSD_Type; type = V_value
  191.     ControlInfo MSD_NumPoints; numPoints = V_value
  192.     ControlInfo MSD_XMin; xMin = V_value
  193.     ControlInfo MSD_XMax; xMax = V_value
  194.     ControlInfo MSD_XNoise; percentXNoise = V_value
  195.     ControlInfo MSD_YNoise; percentYNoise = V_value
  196.     ControlInfo MSD_Amplitude; amplitude = V_value
  197.     ControlInfo MSD_Offset; offset = V_value
  198.  
  199.     SetSampleDataSettings(numPoints, xMin, xMax, percentXNoise, percentYNoise, gAutoDisplay)
  200.     
  201.     // If new x or y waves, force mode to "Set Output"
  202.     if (CmpStr(xWave, "_new_") == 0)
  203.         xIsNew = 1
  204.         mode = 1
  205.     endif
  206.     if (CmpStr(yWave, "_new_") == 0)
  207.         yIsNew = 1
  208.         mode = 1
  209.     endif
  210.         
  211.     if (CmpStr(functionType, "Periodic") == 0)
  212.         UpdatePeriodicData(xWave, yWave, mode, type, offset, amplitude)
  213.     endif
  214.     
  215.     if (CmpStr(functionType, "Pulse") == 0)
  216.         UpdatePulseData(xWave, yWave, mode, offset, amplitude)
  217.     endif
  218.     
  219.     if (CmpStr(functionType, "Exponential") == 0)
  220.         UpdateExponentialData(xWave, yWave, mode, offset, amplitude)
  221.     endif
  222.     
  223.     if (CmpStr(functionType, "Gaussian") == 0)
  224.         UpdateGaussianData(xWave, yWave, mode, offset, amplitude)
  225.     endif
  226.     
  227.     if (CmpStr(functionType, "Noise") == 0)
  228.         UpdateNoiseData(xWave, yWave, mode, offset, amplitude)
  229.     endif
  230.     
  231.     Variable totalNumberOfWaves
  232.     if (xIsNew %| yIsNew)
  233.         if (isPanelWindow)
  234.             DoWindow/F $WinName(0,64)        // HR, 12/11/95. We will have created a new graph so bring panel back to the front.
  235.         endif
  236.         totalNumberOfWaves = 0
  237.         do
  238.             if (strlen(WaveName("",totalNumberOfWaves,4)) == 0)
  239.                 break
  240.             endif
  241.             totalNumberOfWaves += 1
  242.         while (1)
  243.         if (xIsNew)
  244.             // menu contains "_new_;_none_;" + wavelist
  245.             PopupMenu MSD_XOutWave,mode=totalNumberOfWaves + 1 + 1 - yIsNew
  246.         endif
  247.         if (yIsNew)
  248.             // menu contains "_new_;" + wavelist
  249.             PopupMenu MSD_YOutWave,mode=totalNumberOfWaves + 1
  250.         endif
  251.     endif
  252. End
  253.  
  254. Function MSD_FunctionTypeProc(ctrlName,popNum,popStr) : PopupMenuControl
  255.     String ctrlName
  256.     Variable popNum
  257.     String popStr
  258.     
  259.     PauseUpdate; Silent 1
  260.     String dfSav =  SetMakeSampleDataFolderCurrent()
  261.  
  262.     Variable newFunctionType, oldFunctionType
  263.     
  264.     NVAR gSetVarFunctionType = gSetVarFunctionType
  265.     
  266.     newFunctionType = popNum
  267.     oldFunctionType = gSetVarFunctionType
  268.     if (newFunctionType == oldFunctionType)
  269.         SetDataFolder dfSav
  270.         return 0
  271.     endif
  272.     
  273.     RemovePeriodicControls()
  274.     RemovePulseControls()
  275.     RemoveExponentialControls()
  276.     RemoveGaussianControls()
  277.     RemoveNoiseControls()
  278.     
  279.     if (newFunctionType == 1)
  280.         AddPeriodicControls()
  281.     endif
  282.     if (newFunctionType == 2)
  283.         AddPulseControls()
  284.     endif
  285.     if (newFunctionType == 3)
  286.         AddExponentialControls()
  287.     endif
  288.     if (newFunctionType == 4)
  289.         AddGaussianControls()
  290.     endif
  291.     if (newFunctionType == 5)
  292.         AddNoiseControls()
  293.     endif
  294.     
  295.     gSetVarFunctionType = newFunctionType
  296.     SetDataFolder dfSav
  297. End
  298.  
  299. Function/S AddSampleDataControlsPrompt()
  300.     String s
  301.     
  302.     s = "New Graph;"
  303.     if (strlen(WinName(0, 1)) == 0)        // no graphs exist ?
  304.         s += "\\M1"                            // HR, 12/11/95: Enable disabling of popup menu items.
  305.         s += "("                                // causes "Top Graph" to be disabled
  306.     endif
  307.     s += "Top Graph;"
  308.     s += "New Panel"
  309.     
  310.     return s
  311. End
  312.  
  313. Function AddSampleDataControls(graphOrPanel)
  314.     Variable graphOrPanel                    // 1 = new graph, 2 = top graph, 3 = new panel, 4 = existing panel
  315.  
  316.     MakeSampleDataGeneralGlobals()
  317.  
  318.     String dfSav =  SetMakeSampleDataFolderCurrent()
  319.     
  320.     if (exists("gSetVarGlobalsInited") == 0)
  321.         InitSampleDataControlsGlobals()
  322.     endif
  323.     
  324.     if (graphOrPanel == 1)                    // new graph ?
  325.         Display/W=(5, 40, 595, 350) as "Make Sample Data Output"
  326.     endif
  327.     
  328.     if (graphOrPanel == 2)                    // top graph ?
  329.         DoWindow/F $WinName(0, 1)        // Bring top graph up
  330.         ControlInfo MSD_FunctionType
  331.         if (V_flag != 0)
  332.             SetDataFolder dfSav
  333.             Abort "The graph already has sample data controls."
  334.         endif
  335.     endif
  336.     
  337.     if (graphOrPanel == 3)                    // new panel ?
  338.         NewPanel/W=(5,250,595,350) as "Sample Data Controls"
  339.     endif
  340.     
  341.     if (graphOrPanel == 4)                    // existing panel ?
  342.         DoWindow/F MakeSampleDataControlsPanel
  343.         if (V_flag == 0)
  344.             if (exists("MakeSampleDataControlsPanel") == 5)
  345.                 Execute "MakeSampleDataControlsPanel()"            // Execute recreation macro.
  346.             else
  347.                 NewPanel/W=(5,250,595,350) as "Sample Data Controls"
  348.                 DoWindow/C MakeSampleDataControlsPanel
  349.             endif
  350.         endif
  351.     endif
  352.     
  353.     if (WinType("") == 1)                    // adding controls to a graph ?
  354.         ControlBar 97
  355.     else
  356.         GetWindow kwTopWin, wsize
  357.         MoveWindow V_left,V_top,V_left+590,V_top+100        // adding controls to a panel
  358.     endif
  359.     PopupMenu MSD_FunctionType,pos={7,4},size={198,19},proc=MSD_FunctionTypeProc,title="Function Type"
  360.     PopupMenu MSD_FunctionType,mode=1,value= #"\"Periodic;Pulse;Exponential;Gaussian;Noise\""
  361.     PopupMenu MSD_Mode,pos={279,4},size={127,19}
  362.     PopupMenu MSD_Mode,mode=1,value= #"\"Set Output;Add to Output;Multiply Output\""
  363.     PopupMenu MSD_XOutWave,pos={413,4},size={135,19},title="X Output"
  364.     PopupMenu MSD_XOutWave,mode=2,value= #"\"_new_;_none_;\" + WaveList(\"*\", \";\", \"\")"
  365.     PopupMenu MSD_YOutWave,pos={413,27},size={133,19},title="Y Output"
  366.     PopupMenu MSD_YOutWave,mode=1,value= #"\"_new_;\" + WaveList(\"*\", \";\", \"\")"
  367.     SetVariable MSD_NumPoints,pos={20,30},size={124,14},title="NumPoints",font="Geneva"
  368.     SetVariable MSD_NumPoints,fSize=10
  369.     SetVariable MSD_NumPoints,limits={10,10000,10},value=gSetVarNumPoints
  370.     SetVariable MSD_XMin,pos={158,29},size={100,14},title="X Min",font="Geneva",fSize=10
  371.     SetVariable MSD_XMin,limits={-INF,INF,1},value=gSetVarXMin
  372.     SetVariable MSD_XMax,pos={278,29},size={100,14},title="X Max",font="Geneva",fSize=10
  373.     SetVariable MSD_XMax,limits={-INF,INF,1},value=gSetVarXMax
  374.     SetVariable MSD_Amplitude,pos={24,53},size={120,14},title="Amplitude",font="Geneva"
  375.     SetVariable MSD_Amplitude,fSize=10,limits={-INF,INF,1},value=gSetVarAmplitude
  376.     SetVariable MSD_Offset,pos={158,52},size={100,14},title="Offset",font="Geneva"
  377.     SetVariable MSD_Offset,fSize=10,limits={-INF,INF,1},value=gSetVarOffset
  378.     SetVariable MSD_XNoise,pos={272,53},size={105,14},title="X Noise (%)",font="Geneva"
  379.     SetVariable MSD_XNoise,fSize=10,limits={-INF,INF,1},value=gSetVarXNoise
  380.     SetVariable MSD_YNoise,pos={392,53},size={105,14},title="Y Noise (%)",font="Geneva"
  381.     SetVariable MSD_YNoise,fSize=10,limits={-INF,INF,1},value=gSetVarYNoise
  382.     AddPeriodicControls()
  383.     Button MSD_Update,pos={488,73},size={60,20},proc=MSD_UpdateProc,title="Update"
  384.     SetDataFolder dfSav
  385. End
  386.  
  387. Proc AddSampleDataControlsDialog(graphOrPanel)
  388.     Variable graphOrPanel=3
  389.     Prompt graphOrPanel, "Add controls to", popup AddSampleDataControlsPrompt()
  390.  
  391.     AddSampleDataControls(graphOrPanel)
  392. End
  393.  
  394. Function ShowSampleDataPanel()
  395.     AddSampleDataControls(4)                // Displays panel or makes new panel if none already exists.
  396. End
  397.  
  398. Function RemoveSampleDataControls()
  399.     PauseUpdate; Silent 1
  400.     
  401.     if (WinType("") == 1)                    // removing controls from a graph
  402.         ControlBar 0
  403.         KillControl MSD_FunctionType
  404.         KillControl MSD_Mode
  405.         KillControl MSD_XOutWave
  406.         KillControl MSD_YOutWave
  407.         KillControl MSD_NumPoints
  408.         KillControl MSD_XMin
  409.         KillControl MSD_XMax
  410.         KillControl MSD_Amplitude
  411.         KillControl MSD_Offset
  412.         KillControl MSD_XNoise
  413.         KillControl MSD_YNoise
  414.         KillControl MSD_Update
  415.         RemovePeriodicControls()
  416.         RemovePulseControls()
  417.         RemoveExponentialControls()
  418.         RemoveGaussianControls()
  419.         RemoveNoiseControls()
  420.     else                                        // removing entire panel
  421.         DoWindow/K $WinName(0,64)
  422.     endif
  423. End
  424.